package com.team.coupon.controller;

import com.team.common.core.web.domain.AjaxResult;
import com.team.coupon.domain.BizCoupon;
import com.team.coupon.exception.CustomException;
import com.team.coupon.service.BizCouponService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@Tag(name = "优惠券管理", description = "优惠券相关接口")
@RequestMapping("/coupon")
public class BizCouponController {

    @Autowired
    private BizCouponService bizCouponService;


    /**
     * 获取今天秒杀的优惠券列表
     * 已完成
     */
    @Operation(summary = "获取优惠券列表", description = "查看今天的优惠券秒杀活动，返回优惠券列表")
    @GetMapping("/coupons")
    public AjaxResult listCoupons() {
        try{
            return AjaxResult.success(bizCouponService.listCoupons());
        }catch (CustomException e){
            log.error("获取优惠券列表失败: {}", e.getMsg());
            return AjaxResult.error(e.getMsg());
        } catch (Exception e) {
            log.error("获取优惠券列表异常", e);
            return AjaxResult.error("系统异常，请稍后重试");
        }
    }

    /**
     * 添加优惠券
     * 已完成
     */
    @Operation(summary = "添加优惠券", description = "添加优惠券功能，判断优惠券是否合法，合法则插入数据库，同时判断是否属于今天的秒杀活动，如果是则更新redis")
    @PostMapping("/addCoupon")
    public AjaxResult addCoupons(@RequestBody BizCoupon bizCoupon) {
        try{
            if (bizCoupon == null) {
                return AjaxResult.error("优惠券信息不能为空");
            }
            //调用业务层
            return AjaxResult.success(bizCouponService.addCoupon(bizCoupon));
        }catch (CustomException e){
            log.error("添加优惠券失败: {}", e.getMsg());
            return AjaxResult.error(e.getMsg());
        } catch (Exception e) {
            log.error("添加优惠券异常", e);
            return AjaxResult.error("系统异常，请稍后重试");
        }
    }

    /**
     * 更新优惠券
     * 已完成
     */
    @Operation(summary = "更新优惠券", description = "更新优惠券功能，判断优惠券是否合法，合法则插入数据库，同时判断是否属于今天的秒杀活动，如果是则更新redis")
    @PutMapping("/updateCoupon")
    public AjaxResult updateCoupon(@RequestBody BizCoupon bizCoupon) {
        try{
            return AjaxResult.success(bizCouponService.updateCoupon(bizCoupon));
        }catch (CustomException e){
            return AjaxResult.error(e.getMsg());
        }
    }
    /**
     * 删除优惠券
     * 已完成
     */
    @Operation(summary = "删除优惠券", description = "删除优惠券功能，判断优惠券是否合法，合法则插入数据库，同时判断是否属于今天的秒杀活动，如果是则更新redis")
    @PutMapping("/deleteCoupon/{bizCouponId}")
    public AjaxResult deleteCoupon(@PathVariable Long bizCouponId) {
        try{
            return AjaxResult.success(bizCouponService.deleteCoupon(bizCouponId));
        }catch (CustomException e){
            return AjaxResult.error(e.getMsg());
        }
    }

    /**
     * TODO: 暂时有一点小问题，需要再优化
     * 根据主体id查询优惠券信息
     * 主要针对查看商家店铺时调用该接口：查看当前店铺的优惠券信息，其中不包含秒杀信息，不包括过期的优惠券
     * 进入商家详情页时，查询该商家的优惠券
     * TODO: 未完成
     */
    @GetMapping("/getCouponByEntityId/{entityId}")
    public AjaxResult getCouponByEntityId(@PathVariable Long entityId) {
        try{
            return AjaxResult.success(bizCouponService.getCouponByEntityId(entityId));
        }catch (CustomException e){
            return AjaxResult.error(e.getMsg());
        }
    }
    /**
     * 查看所有的优惠券信息，其中通过 根据传递的优惠券类型 查询优惠券信息
     *
     */
    @GetMapping("/getCouponByType/{type}")
    public AjaxResult getCouponByType(@PathVariable int type) {
        try{
            return AjaxResult.success(bizCouponService.getCouponByType(type));
        }catch (CustomException e){
            return AjaxResult.error(e.getMsg());
        }
    }


    /**
     * 根据id查询优惠券信息
     * 已完成
     */
    @GetMapping("/getCoupon/{id}")
    public AjaxResult getCouponById(@PathVariable Long id) {
        try{
            return AjaxResult.success(bizCouponService.getCouponById(id));
        } catch (CustomException e){
            return AjaxResult.error(e.getMsg());
        }
    }

}
